<run>
  <precisionModel scale="1.0" offsetx="0.0" offsety="0.0"/>

<case>
  <desc>P - point</desc>
  <a>
    POINT(10 10)
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mP - multipoint with repeated points</desc>
  <a>
    MULTIPOINT (80 280, 80 220, 160 220, 80 220)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>mP - multipoint with no repeated points</desc>
  <a>
    MULTIPOINT (80 280, 80 220, 160 220)
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mP - empty</desc>
  <a>
    MULTIPOINT EMPTY
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>L - simple line</desc>
  <a>
    LINESTRING(10 10, 20 20)
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>L - non-simple, proper interior intersection</desc>
  <a>
    LINESTRING (20 60, 160 60, 80 160, 80 20)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>L - non-simple, interior intersection at vertices</desc>
  <a>
    LINESTRING (20 80, 80 20, 80 80, 140 60, 80 20, 160 20)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>L - non-simple, interior intersection at Bdy/non-vertex</desc>
  <a>
    LINESTRING (20 60, 100 60, 60 100, 60 60)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>L - non-simple, interior intersection at Bdy/vertex</desc>
  <a>
    LINESTRING (20 60, 60 60, 100 60, 60 100, 60 60)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>L - simple, intersection at Bdy/Bdy (ring)</desc>
  <a>
    LINESTRING (20 20, 80 20, 80 80, 20 20)
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>L - simple, intersection at Bdy/Bdy + non-vertex</desc>
  <a>
    LINESTRING (80 80, 20 20, 20 80, 140 80, 140 140, 80 80)
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>L - empty</desc>
  <a>
    LINESTRING EMPTY
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>


<case>
  <desc>mL - intersection between elements at non-vertex</desc>
  <a>
    MULTILINESTRING(
  (40 140, 160 40), 
  (160 140, 40 40))
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>mL - no intersection between elements</desc>
  <a>
    MULTILINESTRING(
  (20 160, 20 20), 
  (100 160, 100 20))
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mL - mutual intersection at endpoints only</desc>
  <a>
    MULTILINESTRING ((60 140, 20 80, 60 40), 
  (60 40, 100 80, 60 140))
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mL - one element is non-simple</desc>
  <a>
    MULTILINESTRING ((60 40, 140 40, 100 120, 100 0), 
  (100 200, 200 120))
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>mL - proper intersection between elements at vertex</desc>
  <a>
    MULTILINESTRING ((40 120, 100 60), 
  (160 120, 100 60), 
  (40 60, 160 60))
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>mL - intersection between closed lines</desc>
  <a>
    MULTILINESTRING ((80 160, 40 220, 40 100, 80 160), 
  (80 160, 120 220, 120 100, 80 160))
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>mL - intersection between closed and open lines</desc>
  <a>
    MULTILINESTRING ((80 160, 40 220), 
  (80 160, 120 220, 120 100, 80 160), 
  (40 100, 80 160))
  </a>
<test>
  <op name="isSimple" arg1="A">
    false
  </op>
</test>
</case>

<case>
  <desc>A</desc>
  <a>
    POLYGON ((180 260, 80 300, 40 180, 160 120, 180 260))
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>A - empty</desc>
  <a>
    POLYGON EMPTY
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mA</desc>
  <a>
    MULTIPOLYGON (((240 160, 140 220, 80 60, 220 40, 240 160)), 
  ((160 380, 100 240, 20 380, 160 380), 
    (120 340, 60 360, 80 320, 120 340)))
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

<case>
  <desc>mA - with touching elements</desc>
  <a>
    MULTIPOLYGON (((240 160, 100 240, 80 60, 220 40, 240 160)), 
  ((160 380, 100 240, 20 380, 160 380), 
    (120 340, 60 360, 80 320, 120 340)))
  </a>
<test>
  <op name="isSimple" arg1="A">
    true
  </op>
</test>
</case>

</run>
